package com.learn.ioc.xml;

import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
//import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

/**
 * 使用已过时的 XmlBeanFactory 读取 Xml 中配置的 bean，
 * 	  虽然 XmlBeanFactory 类已过时，但是不影响我们阅读源码
 *
 * XmlBeanFactory
 * 		DefaultListableBeanFactory 的方便扩展，它从 XML 文档中读取 bean 定义。
 * 下面委托给 XmlBeanDefinitionReader;等效于使用 XmlBeanDefinitionReader 和 DefaultListableBeanFactory。
 * 必需的 XML 文档的结构、元素和属性名称在这个类中被硬编码。
 *
 * (当然，如果需要，可以运行转换来生成这种格式)。“bean”不需要是 XML 文档的根元素: 这个类将解析 XML 文件中的所有 bean 定义元素。
 * 这个类用 DefaultListableBeanFactory 超类注册每个 bean 定义，并依赖后者对 BeanFactory 接口的实现。它支持单例、原型和对这
 * 两种 bean 的引用。参见“spring bean - 3. x。xsd”(或历史上的“spring-beans-2.0.dtd”)，以获得有关选项和配置样式的详细信息。
 *
 * @author: ganquanzhong
 * @date: 2020/7/6 13:30
 */
public class XmlBeanFactoryTest {

	public static void main(String[] args) {
		/**
		 *	使用 BeanFactory 进行分析 ，虽然已过期
		 *	现在都是使用 ApplicationContext
		 */
//		ClassPathResource resource = new ClassPathResource("spring-bean01.xml");
//		XmlBeanFactory beanFactory = new XmlBeanFactory(resource);
//		for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {
//			System.out.println(beanDefinitionName);
//		}

		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-bean01.xml");
		ConfigurableListableBeanFactory beanFactory2 = context.getBeanFactory();
		for (String beanDefinitionName : beanFactory2.getBeanDefinitionNames()) {
			System.out.println(beanDefinitionName);
		}
	}
}
/* Output:
调用了自定义的BeanFactoryPostProcessor org.springframework.beans.factory.support.DefaultListableBeanFactory@1554909b: defining beans [user,a,b,myBeanFactoryPostProcessor]; root of factory hierarchy
BeanDefinitionName：user
user bean properties（Bean的属性值）:  PropertyValues: length=4; bean property 'uid'; bean property 'username'; bean property 'pwd'; bean property 'addr'
BeanDefinitionName：a
a bean properties（Bean的属性值）:  PropertyValues: length=1; bean property 'b'
BeanDefinitionName：b
b bean properties（Bean的属性值）:  PropertyValues: length=1; bean property 'a'
BeanDefinitionName：myBeanFactoryPostProcessor
myBeanFactoryPostProcessor bean properties（Bean的属性值）:  PropertyValues: length=0
【user-afterPropertiesSet】-实现InitializingBean接口的afterPropertiesSet方法，在bean初始化会自动调用该方法！
【user-initMethod】-在bean被spring容器初始化时，会执行initMethod属性指定的方法！
user
a
b
myBeanFactoryPostProcessor
*///~